/** Taken from "The Definitive ANTLR 4 Reference" by Terence Parr */

// Derived from https://json.org

// $antlr-format alignTrailingComments true, columnLimit 150, maxEmptyLinesToKeep 1, reflowComments false, useTab false
// $antlr-format allowShortRulesOnASingleLine true, allowShortBlocksOnASingleLine true, minEmptyLines 0, alignSemicolons ownLine
// $antlr-format alignColons trailing, singleLineOverrulesHangingColon true, alignLexerCommands true, alignLabels true, alignTrailers true

lexer grammar BpmLexer;

options {
   caseInsensitive = true;
}

SPACE: [ \t\r\n\u00A0\uFEFF\u2003]+                     -> channel(HIDDEN); //没有这一行，会报错：Discontinuous sequence of tokens is generated by lexer
SINGLE_LINE_COMMENT : '<!--' .*? '-->' (NEWLINE | EOF)  -> channel(HIDDEN);
MULTI_LINE_COMMENT : '<!--' .*? '-->'                   -> channel(HIDDEN);
DTD : '<!' .*? '>'                                      -> channel(HIDDEN);

CDATA              : '<![CDATA[' .*? ']]>';
SLASH              : '/';
EQUALS             : '=';
STRING             : '"' ~[<"]* '"' | '\'' ~[<']* '\'';
OPEN               : '<';
SLASH_CLOSE        : '/>';
CLOSE              : '>';
//node name
MXCELL             : 'mxCell';
MXPOINT            : 'mxPoint';
ROOT               : 'ROOT';
MXGRAPHMODEL       : 'mxGraphModel';
MXGEOMETRY         : 'mxGeometry';
ARRAY              : 'ARRAY';
//behavior
AUTO_TASK          : 'AutoTask';
STATEFUL_TASK      : 'StatefulTask';
CALL               : 'Call';
RETURN_VALUE       : 'ReturnValue';
FLOW               : 'Flow';
DECISION           : 'Decision';
SWITCH_TASK        : 'SwitchTask';
EXCEPTION_HANDLER  : 'ExceptionHandler';
FINALLY_HANDLER    : 'FinallyHandler';
FORK               : 'Fork';
JOIN               : 'Join';
START              : 'Start';
END                : 'End';
PARAM              : 'Param';
RETURN             : 'Return';
//attribute name
ID                 : 'ID';
PARENT             : 'PARENT';
STYLE              : 'STYLE';
VERTEX             : 'VERTEX';
AS                 : 'AS';
EDGE               : 'EDGE';
SOURCE             : 'SOURCE';
TARGET             : 'TARGET';
VALUE              : 'VALUE';
NAME               : 'NAME';
DESCRIPTION        : 'DESCRIPTION';
CALLABLE           : 'CALLABLE';
METHOD             : 'METHOD';
HEIGHT             : 'HEIGHT';
WIDTH              : 'WIDTH';
TYPE               : 'TYPE';
X                  : 'X';
Y                  : 'Y';
RELATIVE           : 'RELATIVE';
INDEX              : 'INDEX';
REENTERABLE        : 'REENTERABLE';

fragment NEWLINE
   : '\r\n'
   | [\r\n\u2028\u2029]
   ;
